#include "HiloCliente.h"
#include <string>
#include "Moderador.h"

using std::string;

HiloCliente::HiloCliente(Moderador& mode, Conexion* cnx) :
moderador(mode), stream(cnx) {}

bool HiloCliente::terminoConexion(const string& mensaje) {
	bool termino = false;
	if (mensaje.size() == 0){
		termino = true;
	}
	return termino;
}

void* HiloCliente::run() {
	string mensaje = "";
	Mensaje msj;
	bool salir = false;
	while (salir != true) {
		Login login;
		Mensaje msj;
		mensaje = "";
		int codRetorno=-1;
		Json::Value loginJson;
		mensaje = stream->receive();
		if (!terminoConexion(mensaje)) {
			while (codRetorno != LOGINOK){
				loginJson = msj.convertJson(mensaje);
				codRetorno = login.procesarLogin(loginJson);
				stream->send(msj.convertirIntaStr(codRetorno));
				if(codRetorno != LOGINOK){
					mensaje = stream->receive();
				}
			}
			int nivel = login.getNivel(loginJson);
			Json::Value partidasJson = moderador.partidasToJson();
			partidasJson["nivelCliente"] = nivel;
			stream->send(partidasJson.toStyledString());
			std::cout << "envio"<<partidasJson.toStyledString() << std::endl;
			//recibe respuesta lobby
			std::string respuesta= stream->receive();
			Json::Value respuestaJson = msj.convertJson(respuesta);
			idCliente = moderador.nuevoIdCliente();
			nivel = respuestaJson["nivel"].asInt();
			if(respuestaJson["operacion"]=="nueva"){
				idAdmin = moderador.agregarPartida(stream, idCliente, nivel,
						respuestaJson["maxJugadores"].asInt(), loginJson);
				moderador.lanzarPartidas(nivel);
			} else if(respuestaJson["operacion"]=="unirse"){
				idAdmin = moderador.agregarCliente(stream, respuestaJson["id"].asInt(), idCliente, nivel, loginJson);
				moderador.lanzarPartidas(nivel);
			}else{
				salir=true;
			}
			while (!salir) {
				mensaje = stream->receive();
				if (!terminoConexion(mensaje)) {
					moderador.setMensaje(idAdmin, idCliente, mensaje);
				}else{
					salir = true;
				}
			}
		}else{
			salir = true;
		}
	}
	delete stream;
	return NULL;
}
